package com.py.custom.tms.application.jvm.classload;

/**
 * static final : 修饰的属性，如果在编译期间就可以确定的值，
 * 那么调用方在编译的时候会直接使用具体的值。这样就不会触发定义类的初始化(MyParent2的初始化)
 * <p>
 * 通过反编译：javap -v MyTest2
 * 助记符：
 * ldc：将int、float、或者是String类型的常量 从常量池推送到操作数栈顶。（String如果是new出来的则是getstatic）
 * bipush：-128～127 ；数值在这个范围；是直接把该数保存到操作数栈，并推送到操作数栈顶。
 * sipush：-32768～32767 ；数值在这个范围；是直接把该数保存到操作数栈，并推送到操作数栈顶。
 * iconst_m1～iconst_5：-1~5；数值在这个范围；是直接把该数保存到操作数栈，并推送到操作数栈顶。
 */

public class MyTest2 {

    public static void main(String[] args) {
        System.out.println(MyParent2.str);
        System.out.println(MyParent2.a);
        System.out.println(MyParent2.f);
    }
}

class MyParent2 {

    public static final String str = "hello world";

    public static final int a = 5;

    public static final float f = 5;

    static {
        System.out.println("MyParent2 static block");
    }
}

